Pad Delphi pri definici vicerozmeroveho konstantniho pole
Otázka od: Ing. Jiri SOKOL
27. 11. 2002 12:06
Ahoj,
zkousel jsem toto:
type
pole=array[1..2,1..5]of variant;
const
status:pole=
(1,true,'Ahoj','Uvitani',''),
(2,false,'Hezky den','Rozlouceni','');
Pak mi spadnou cely Delphi. Nevite nekdo, kde delam chybu?
P.S.:Obsah konstatniho pole berte s rezervou ... hodnoty pouzivam jine, ale
nejsou stejneho typu a
proto bych potreboval udrzet typ variant
Ing. Jiri Sokol, js-delphi@seznam.cz, +420251431187
D6ProfSP2,WinNT
amatersky programator
______________________________________________________________________
Reklama:
Mapy Prahy, Brna a Cech najdete na http://www.mapy.cz
Odpovedá: Lebeda David
27. 11. 2002 12:30
> zkousel jsem toto:
>
> type
> pole=array[1..2,1..5]of variant;
> const
> status:pole=
> (1,true,'Ahoj','Uvitani',''),
> (2,false,'Hezky den','Rozlouceni','');
>
> Pak mi spadnou cely Delphi. Nevite nekdo, kde delam chybu?
> P.S.:Obsah konstatniho pole berte s rezervou ... hodnoty pouzivam
> jine, ale nejsou stejneho typu a proto bych potreboval udrzet typ
> variant
Ahoj,
a nebylo by lepsi mit jednorozmerne pole recordu? Record je
vhodnejsi k uchovavani dat ruznych typu.
David Lebeda
Odpovedá: Robert Vršecký
27. 11. 2002 16:05
Proč padájí delphi je jasné. Pokud se napíše
array[1..2,1..5]of variant, tak pole může být pouze jednoho typu. (např
integer). Není možné mít jednu hodnotu číselnou a druhou hodnotu textovou,
protože tomu delphi nemůžou rozumět... Rešení je opravdu přes record viz
předchozií příspěvek a nebo přes dynamické pole...teda pokud chceš udržet
proměnnou typu varriant a mít více rozměrné pole....
Robert
----- Original Message -----
From: "Ing. Jiri SOKOL" <JS-delphi@seznam.cz>
To: "dotaz-delp" <delphi-l@clexpert.cz>
Sent: Wednesday, November 27, 2002 10:07 AM
Subject: Pad Delphi pri definici vicerozmeroveho konstantniho pole
Ahoj,
zkousel jsem toto:
type
pole=array[1..2,1..5]of variant;
const
status:pole=
(1,true,'Ahoj','Uvitani',''),
(2,false,'Hezky den','Rozlouceni','');
Pak mi spadnou cely Delphi. Nevite nekdo, kde delam chybu?
P.S.:Obsah konstatniho pole berte s rezervou ... hodnoty pouzivam jine, ale
nejsou stejneho typu a
proto bych potreboval udrzet typ variant
Ing. Jiri Sokol, js-delphi@seznam.cz, +420251431187
D6ProfSP2,WinNT
amatersky programator
______________________________________________________________________
Reklama:
Mapy Prahy, Brna a Cech najdete na http://www.mapy.cz
Odpovedá: Petr Vones
27. 11. 2002 22:59
From: "Ing. Jiri SOKOL" <JS-delphi@seznam.cz>
> To uz me taky napadlo, ale zajimalo me, proc dochazi k te chybe.
[Error] Project1.dpr(9): Incompatible types: 'Array' and 'Integer'
Typ Variant navic nelze inicializovat pomoci typove konstanty, pouze az v dobe
behu kodu.
> Pouzitim recordu ale dojde k tomu, ze se na hodnoty nedostanu pomoci indexu
> a to je skoda. Budu muset predelat system kodu.
Co to napsat jako seznam objektu, pak lze udelat pristup dle libosti.
Petr Vones
Odpovedá: Petr Vones
27. 11. 2002 23:08
From: "Robert Vršecký" <robert.vrsecky@softok.cz>
> Proč padájí delphi je jasné.
Neni, prekladac musi ohlasit chybu a ne spadnout s AV, v Delphi 7 je to uz
opravene.
> Pokud se napíše array[1..2,1..5]of variant, tak pole může být pouze jednoho
> typu. (např integer). Není možné mít jednu hodnotu číselnou a druhou hodnotu
> textovou, protože tomu delphi nemůžou rozumět...
To je samozrejme nesmysl, od ceho je typ Variant:
program Project1;
{$APPTYPE CONSOLE}
uses
Variants;
var
AnArray: array [0..2] of Variant;
I: Integer;
begin
AnArray[0] := 42;
AnArray[1] := 'Bla';
AnArray[2] := 3.14;
for I := Low(AnArray) to High(AnArray) do
WriteLn(I, ': ', VarToStr(AnArray[I]));
ReadLn;
end.
Petr Vones
Odpovedá: Bohuslav Švancara
29. 11. 2002 16:31
Tohle (skoro) funguje:
{$A+,B-,C+,D+,E-,F-,G+,H+,I+,J+,K-,L+,M-,N+,O-,P+,Q+,R+,S-,T-,U-,V+,W+,X+,Y+
,Z1}
type
TPole = array[1..6] of TVarRec;
const
AnsiAhoj: AnsiString = 'Ansi_Ahoj';
ShortAhoj: ShortString = 'Short_Ahoj';
Ext : Extended = 0.123456e3;
Status: TPole = ((VInteger: 12345; VType: vtInteger),
(VBoolean: true; VType: vtBoolean),
(VAnsiString: @AnsiAhoj; VType: vtAnsiString),
(VString: @ShortAhoj; VType: vtString),
(VBoolean: false; VType: vtBoolean),
(VExtended: @Ext; VType: vtExtended));
function GetStatus(const Index: Integer): Variant;
begin
with Status[Index] do begin
case VType of
vtInteger: Result := VInteger;
vtBoolean: Result := VBoolean;
vtChar: Result := VChar;
vtExtended: Result := VExtended^;
vtString: Result := VString^;
vtPChar: Result := VPChar^;
vtAnsiString: Result := AnsiString(VAnsiString^);
vtVariant: Result := VVariant^;
end;
end;
end;
procedure P;
var
S: string;
i: Integer;
e: Extended;
begin
S := format('%d %s', [Status[1].VInteger, GetStatus(3)]);
if Status[2].VBoolean
then ShowMessage(S);
S := format('%d %s %g', [Status[1].VInteger, GetStatus(4),
Status[6].VExtended^]);
if not GetStatus(5)
then ShowMessage(S);
//Nasledujici prikazy ale nefunguji - nevim proc. Mozna "Format" nema rad
varianty...
//Nastava vyjimka EConvertError: Format '%d' invalid or incompatiible with
argument
// S := format('%d',[GetStatus(1)]);
//Ale pritom tohle funguje:
i := GetStatus(1);
// S := format('%g',[GetStatus(6)]);
//Ale pritom tohle funguje:
e := GetStatus(6);
// a toto taky funguje. Mozna to chce jeste nejak dopiplat funkci
GetStatus...
S := format('%g', [Status[6].VExtended^]);
end;
S pozdravem
Bohuslav Švancara, prom. mat.
svancara@softprojekt.cz
> -----Original Message-----
> From: delphi-l-owner@clexpert.cz [mailto:delphi-l-owner@clexpert.cz]On
> Behalf Of Ing. Jiri SOKOL
> Sent: Wednesday, November 27, 2002 10:07 AM
> To: dotaz-delp
> Subject: Pad Delphi pri definici vicerozmeroveho konstantniho pole
>
>
> Ahoj,
>
> zkousel jsem toto:
>
> type
> pole=array[1..2,1..5]of variant;
> const
> status:pole=
> (1,true,'Ahoj','Uvitani',''),
> (2,false,'Hezky den','Rozlouceni','');
>
> Pak mi spadnou cely Delphi. Nevite nekdo, kde delam chybu?
> P.S.:Obsah konstatniho pole berte s rezervou ... hodnoty pouzivam
> jine, ale nejsou stejneho typu a
> proto bych potreboval udrzet typ variant
>
> Ing. Jiri Sokol, js-delphi@seznam.cz, +420251431187
> D6ProfSP2,WinNT
> amatersky programator
>
> ______________________________________________________________________
> Reklama:
> Mapy Prahy, Brna a Cech najdete na http://www.mapy.cz
>